package com.thn.news.controller;

import com.thn.news.model.Article;
import com.thn.news.model.ArticleCategory;
import com.thn.news.remote.model.AdminInfo;
import com.thn.news.remote.model.Author;
import com.thn.news.remote.service.user.AdminFeign;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import java.util.Date;
import java.util.List;

/**
 * 文章管理的 RESTful 控制器。
 * 提供基于 HTTP 的增删改查操作（CRUD），对应 RESTful API 设计规范。
 * GET /api/articles：获取所有文章。
 * GET /api/articles/{id}：根据 ID 获取一篇文章。
 * POST /api/articles：创建一篇新文章。
 * PUT /api/articles/{id}：根据 ID 更新文章。
 * DELETE /api/articles/{id}：根据 ID 删除文章。
 */
@Slf4j
@RestController
@RequestMapping("/api/articles")
public class ArticleController {

    /*
     * 注入文章业务逻辑服务，用于处理与文章相关的持久化操作。
     */
    //@Autowired
    //private ArticleService articleService;



    @Autowired
    private  DiscoveryClient discoveryClient;

    @Autowired
    private AdminFeign adminFeign;

    /**
     * 获取所有文章列表。
     * HTTP 方法：GET
     * 路径：/api/articles
     *
     * @return 返回包含所有文章的列表
     */
    //@SentinelResource("AllArticles")
    @GetMapping
    public List<Article> getAllArticles() {
        //return articleService.findAll();
        throw new UnsupportedOperationException("该方法尚未实现");
    }


    /**
     * 获取热点排名前n的文章列表。
     * HTTP 方法：GET
     * 路径：/api/articles/top/{count}
     *
     * @return 返回包含所有文章的列表
     */
    //@SentinelResource(value = "TopArticles", fallback = "getTopArticlesFallback")
    @GetMapping("/top")
    public List<Article> getTopArticles(@RequestParam(value = "count", required = true) int count) {
        // 定义文章列表
        List<Article> articles = new java.util.ArrayList<>();
        for (int i = 0; i < count; i++){
            // 随机生成测试文章列表
            Article article = new Article("test-" + i, "测试文章" + i, "none", "测试内容" + i, new Date(), new ArticleCategory("1", "测试分类", "测试描述"));
            ResponseEntity<Author> profile = adminFeign.getAuthorById(Integer.toString( i));
            if (profile.getStatusCode().is2xxSuccessful()) {
                assert profile.getBody() != null;
                log.info("获取文章作者信息成功：{}", profile.getBody().getName());
                Author author = profile.getBody();
                article.setAuthor(author.getName());
            } else {
                log.info("获取文章作者信息失败！");
            }
            articles.add(article);
        }
        return articles;
    }

    public List<Article> getTopArticlesFallback(int count) {
        return new java.util.ArrayList<>();
    }

    /**
    * 文章ID业务合规检查
    */
    public boolean isArticleID(String str) {
        // 使用正则表达式描述文章ID规则
        return str != null && str.matches("\\d+");
    }

    /**
     * 根据文章 ID 获取指定文章。
     * HTTP 方法：GET
     * 路径：/api/articles/{id}
     *
     * @param id 文章的唯一标识符
     * @return 返回对应 ID 的文章对象，包装在 ResponseEntity 中
     */
    @GetMapping("/{id}")
    public ResponseEntity<Article> getArticleById(@PathVariable String id) {
        if (!isArticleID(id)) {
            // 400 Bad Request 状态码
            return ResponseEntity.badRequest().build();
        }

        ///
        // 依据 ID 查询文章
        Article article = new Article("test-" + id, "测试文章", id, "测试内容", new Date(), new ArticleCategory("1", "测试分类", "测试描述"));
        ResponseEntity<AdminInfo> profile = adminFeign.getDefaultProfile();
        if (profile.getStatusCode().is2xxSuccessful()) {
            assert profile.getBody() != null;
            log.info("获取管理员信息成功：{}", profile.getBody().getUsername());
            AdminInfo adminInfo = profile.getBody();
            article.setAuthor(adminInfo.getUsername());
        } else {
            log.info("获取管理员信息失败！");
        }

        return ResponseEntity.ok(article);
    }

    /**
     *  获取文章作者名--1
     */
//    private String getAuthorName(String authorId)
//    {
//        String name = restTemplate.getForObject("http://localhost:8089/authors/name/" + authorId, String.class);
//        log.info("User微服务返回作者：{}", name);
//        return name;
//    }

    /**
     *  获取文章作者名--2
     */
    private String getAuthorNameWithRestTemplate(String authorId)
    {
        log.info("尝试手动从 DiscoveryClient 获取 user-service 实例...");
        // 设置默认返回值
        String result = "none";
        // 通过服务名称获取所有注册的实例
        List<org.springframework.cloud.client.ServiceInstance> instances = discoveryClient.getInstances("user-service");

        if (instances != null && !instances.isEmpty()) {
            // 通常这里会有一个负载均衡策略，这里简单取第一个实例
            org.springframework.cloud.client.ServiceInstance serviceInstance = instances.get(0);
            String host = serviceInstance.getHost();
            int port = serviceInstance.getPort();
            String serviceUrl = String.format("http://%s:%d/authors/name/%s", host, port, authorId);
            log.info("DiscoveryClient 找到 user-service 实例: {}", serviceUrl);

            // 手动调用服务
            RestTemplate manualRestTemplate = new RestTemplate();
            result = manualRestTemplate.getForObject(serviceUrl, String.class);
            log.info("通过 DiscoveryClient 手动调用结果: {}", result);
        } else {
            log.info("未找到 user-service 实例！");
        }

        return result;
    }

    /**
     *  获取文章作者名--3
     *  使用@LoadBalanced+RestTemplate方式时，必须在RestTemplate类加上@LoadBalanced注解
     */
//    private String getAuthorNameWithLoadBalanced(String authorId) {
//        log.info("尝试使用 @LoadBalanced RestTemplate 调用 user-service...");
//        // RestTemplate 结合 @LoadBalanced 注解，可以直接使用服务名称进行调用
//        String url = "http://user-service/authors/name/" + authorId; // 注意这里是服务名称，不是IP:Port
//        String result = restTemplate.getForObject(url, String.class);
//        log.info("通过 @LoadBalanced RestTemplate 调用结果: {}", result);
//        return result + "lB";
//    }


    /**
     * 创建新文章
     * HTTP 方法：POST
     * 路径：/api/articles
     *
     * @param article 请求体中传递的文章对象
     * @return 返回创建后的文章对象，包装在 ResponseEntity 中
     */
    @PostMapping
    public ResponseEntity<Article> createArticle(@RequestBody Article article) {
        throw new UnsupportedOperationException("该方法尚未实现");
    }

    /**
     * 更新已有文章
     * HTTP 方法：PUT
     * 路径：/api/articles/{id}
     *
     * @param id      要更新的文章 ID，从路径中获取
     * @param article 请求体中传递的更新内容
     * @return 返回更新后的文章对象，包装在 ResponseEntity 中
     */
    @PutMapping("/{id}")
    public ResponseEntity<Article> updateArticle(@PathVariable String id, @RequestBody Article article) {
        throw new UnsupportedOperationException("该方法尚未实现");
    }

    /**
     * 删除指定文章
     * HTTP 方法：DELETE
     * 路径：/api/articles/{id}
     *
     * @param id 要删除的文章 ID
     * @return 返回无内容响应，表示删除成功
     */
    @DeleteMapping("/{id}")
    public ResponseEntity<Void> deleteArticle(@PathVariable String id) {
        throw new UnsupportedOperationException("该方法尚未实现");
    }
}

